package org.example.netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.nio.charset.StandardCharsets;

/**
 * @author 邓天天
 * @date 2021/4/5 11:21
 * 说明
 * 1. 我们自定义一个handler需要集成netty规定好的某个HandlerAdapter(规范) ，这时我们自定义的handler才能被成为handler
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 读取客户段发送的信息
     * @param ctx 上下文对象，含有管道pipeline 和 通道channel
     * @param msg 客户端发送的数据，默认是Object类型
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服务器读取线程"+Thread.currentThread().getName());
        System.out.println("server ctx ="+ctx);
        // 将 msg 转成ByteBuf  是netty提供的，不是ＮＩＯ的ByteBuffer
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("客户端发送的消息是"+byteBuf.toString(CharsetUtil.UTF_8));
        System.out.println("客户段地址："+ctx.channel().remoteAddress());
    }

    // 数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //super.channelReadComplete(ctx);
        // 将数据写入缓存并刷新
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端,这里是服务端", StandardCharsets.UTF_8));
    }


    // 关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
